#ifndef __BLDC_TIM_H
#define __BLDC_TIM_H

#include "main.h"

// TIM2输入捕获测速相关宏定义
#define SPEED_CAPTURE_TIM                TIM2
#define SPEED_CAPTURE_TIM_CLK_ENABLE()   __HAL_RCC_TIM2_CLK_ENABLE()
#define SPEED_CAPTURE_TIM_IRQn           TIM2_IRQn
#define SPEED_CAPTURE_TIM_IRQHandler     TIM2_IRQHandler

// 三霍尔输入捕获引脚配置
#define SPEED_CAPTURE_GPIO_PORT          GPIOA
#define SPEED_CAPTURE_GPIO_PIN_U         GPIO_PIN_0    // PA0 -> hall_u -> TIM2_CH1
#define SPEED_CAPTURE_GPIO_PIN_V         GPIO_PIN_1    // PA1 -> hall_v -> TIM2_CH2  
#define SPEED_CAPTURE_GPIO_PIN_W         GPIO_PIN_2    // PA2 -> hall_w -> TIM2_CH3
#define SPEED_CAPTURE_GPIO_AF            GPIO_AF1_TIM2
#define SPEED_CAPTURE_CHANNEL_U          TIM_CHANNEL_1
#define SPEED_CAPTURE_CHANNEL_V          TIM_CHANNEL_2
#define SPEED_CAPTURE_CHANNEL_W          TIM_CHANNEL_3

// 测速相关参数
#define HALL_STATES_PER_REV              12     // 一圈12次霍尔变化（4极电机）
#define SPEED_TIMEOUT_MS                 500   // 500ms 30度，一圈要6s,也就是rpm为10以内认为是停机。

// RPM计算常数定义 - 工业标准做法
// 计算公式：RPM = (60 * 定时器时钟频率) / (12次霍尔变化总时间)
#define TIMER_CLOCK_FREQ_HZ     128000000UL                    // TIM2时钟频率
#define MOTOR_POLE_PAIRS        2UL      // 电机极对数，4极电机=2对极
#define RPM_CALC_CONSTANT       (uint64_t)(60ULL * TIMER_CLOCK_FREQ_HZ)

// 三霍尔联合测速数据结构
typedef struct {
    uint32_t time_intervals[HALL_STATES_PER_REV];    // 12次霍尔变化的时间间隔
    uint8_t current_index;                           // 当前存储位置（0-11）
    uint8_t valid_count;                            // 有效数据个数（0-12）
    uint32_t last_capture_time;                     // 上次捕获时间
    uint8_t is_first_capture;                       // 跳过第一次标志
    uint32_t last_valid_time;                       // 上次有效捕获的系统时间
    uint32_t total_time;                            // 当前窗口总时间，滑动窗口优化
} hall_speed_capture_t;


// 全局变量extern声明
extern volatile hall_speed_capture_t g_hall_speed_capture;

// 函数声明
uint8_t read_hall_sensors(void);
void hall_init(void);
void bldc_speed_capture_start(void);
void bldc_speed_capture_stop(void);
void bldc_speed_capture_reset(void);
uint32_t bldc_get_motor_rpm_from_capture(void);


#endif
